/**
 * 1.当函数被创建的时候闭包已经形成了
 * 2.闭包是指一个函数可以记住其外部变量并可以访问这些变量
 * 3.闭包作用 :变量私有化、函数工厂
 */

// function outer() {
//   const a = 1
//   const b = 2
//   return function inner() {
//     console.log(b);
//   }
// }
//
// const test = outer()
// test()
//变量私有化
function createCounter(initValue = 0) {
  let counter = initValue

  return {
    getValue() {
      return counter
    },

    increment() {
      counter++
      return counter
    },

    decrement() {
      counter--
      return counter
    }
  }
}

//函数工厂是一种设计模式
// function multiplier(factor) {
//   return function (x) {
//     return x * factor
//   }
// }
//
// const single = multiplier(1)
// const double = multiplier(2)
// const triple = multiplier(3)
// console.log(single(5))
// console.log(double(5))
// console.log(triple(5))


// for (var i = 0; i < 5; i++) {
//   setTimeout(function () {
//     console.log(i)
//   }, 0)
// }
// 5 5 5 5 5

// for (var i = 0; i < 5; i++) {
//   (function (i) {
//     setTimeout(function () {
//       console.log(i)
//     }, 0)
//   })
//   (i)
// }
